package com.changanw.dynamic.thread.pool.sdk.tigger.listener;

import com.alibaba.fastjson.JSON;
import com.changanw.dynamic.thread.pool.sdk.domain.IDynamicThreadPoolService;
import com.changanw.dynamic.thread.pool.sdk.domain.model.ThreadPoolConfigEntity;
import com.changanw.dynamic.thread.pool.sdk.registry.IRegistry;
import org.redisson.api.listener.MessageListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @author changanw
 * @description 动态线程池配置修改监听
 * @date 2024/5/20 11:02
 */
public class ThreadPoolConfigAdjustListener implements MessageListener<ThreadPoolConfigEntity> {
  private Logger logger = LoggerFactory.getLogger(ThreadPoolConfigAdjustListener.class);

  private final IDynamicThreadPoolService dynamicThreadPoolService;

  private final IRegistry registry;
  public ThreadPoolConfigAdjustListener(IDynamicThreadPoolService dynamicThreadPoolService, IRegistry registry) {
    this.dynamicThreadPoolService = dynamicThreadPoolService;
    this.registry = registry;
  }

  @Override
  public void onMessage(CharSequence charSequence, ThreadPoolConfigEntity threadPoolConfigEntity) {
    logger.info("动态线程池，调整线程池配置。线程池名称:{} 核心线程数:{} 最大线程数:{}", threadPoolConfigEntity.getThreadPoolName(), threadPoolConfigEntity.getPoolSize(), threadPoolConfigEntity.getMaximumPoolSize());
    dynamicThreadPoolService.updateThreadPoolConfig(threadPoolConfigEntity);

    // 更新后上报最新数据
    List<ThreadPoolConfigEntity> threadPoolConfigEntities = dynamicThreadPoolService.queryThreadPoolList();
    registry.reportThreadPool(threadPoolConfigEntities);

    ThreadPoolConfigEntity threadPoolConfigEntityCurrent = dynamicThreadPoolService.queryThreadPoolConfigByName(threadPoolConfigEntity.getThreadPoolName());
    registry.reportThreadPoolConfigParameter(threadPoolConfigEntityCurrent);
    logger.info("动态线程池，上报线程池配置：{}", JSON.toJSONString(threadPoolConfigEntity));
  }
}
